<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html>
<head>
<title>Dialogs in Tkinter</title>
<link rel="stylesheet" href="/cfg/format.css" type="text/css">
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<meta name="keywords" content="GUI, dialogs, Tkinter, Python">
<meta name="description" content="This part of the Tkinter tutorial covers dialogs.">
<meta name="language" content="en">
<meta name="author" content="Jan Bodnar">
<meta name="distribution" content="global">

<script type="text/javascript" src="/lib/jquery.js"></script>
<script type="text/javascript" src="/lib/common.js"></script>

</head>

<body>

<div class="container2">

<div id="wide_ad" class="ltow">
<script type="text/javascript"><!--
google_ad_client = "pub-9706709751191532";
/* 160x600, August 2011 */
google_ad_slot = "2484182563";
google_ad_width = 160;
google_ad_height = 600;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</div>

<div class="content2">


<a href="/" title="Home">Home</a>&nbsp;
<a href="..">Contents</a>


<h1>Dialogs in Tkinter</h1>

<p>
In this part of the Tkinter tutorial, we will work with dialogs. 
</p>

<div class="big_hor">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-9706709751191532";
/* big_horizontal */
google_ad_slot = "2904953388";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</div>

<p>
Dialog windows or dialogs are an indispensable part of most modern GUI applications. 
A dialog is defined as a conversation between two or more persons. In a computer 
application a dialog is a window which is used to "talk" to the application. 
A dialog is used to input data, modify data, change the application settings etc. 
Dialogs are important means of communication between a user and a computer program. 
</p>


<h2>Message boxes</h2>

<p>
Message boxes are convenient dialogs that provide messages to the user of the application. 
The message consists of text and image data. Message boxes in Tkinter are located
in the tkMessageBox module. 
</p>

<pre class="code">
#!/usr/bin/python
# -*- coding: utf-8 -*-

"""
ZetCode Tkinter tutorial

In this program, we show various
message boxes.

author: Jan Bodnar
last modified: January 2011
website: www.zetcode.com
"""

from ttk import Frame, Button, Style
from Tkinter import Tk, BOTH
import tkMessageBox as box


class Example(Frame):
  
    def __init__(self, parent):
        Frame.__init__(self, parent)   
         
        self.parent = parent        
        self.initUI()
        
    def initUI(self):
      
        self.parent.title("Message boxes")
        self.style = Style()
        self.style.theme_use("default")        
        self.pack()
        
        error = Button(self, text="Error", command=self.onError)
        error.grid()
        warning = Button(self, text="Warning", command=self.onWarn)
        warning.grid(row=1, column=0)
        question = Button(self, text="Question", command=self.onQuest)
        question.grid(row=0, column=1)
        inform = Button(self, text="Information", command=self.onInfo)
        inform.grid(row=1, column=1)


    def onError(self):
        box.showerror("Error", "Could not open file")
        
    def onWarn(self):
        box.showwarning("Warning", "Deprecated function call")
        
    def onQuest(self):
        box.askquestion("Question", "Are you sure to quit?")
        
    def onInfo(self):
        box.showinfo("Information", "Download completed")
         

def main():
  
    root = Tk()
    ex = Example(root)
    root.geometry("300x150+300+300")
    root.mainloop()  


if __name__ == '__main__':
    main()  
</pre>

<p>
We use the grid manager to set up a grid of
four buttons. Each of the buttons shows a different message box. 
</p>

<pre class="explanation">
import tkMessageBox as box
</pre>

<p>
We import the <code>tkMessageBox</code> which has the functions, that
show dialogs.
</p>

<pre class="explanation">
error = Button(self, text="Error", command=self.onError)
</pre>

<p>
We create an error button, which calls the onError() method. Inside the
method, we show the error message dialog. 
</p>

<pre class="explanation">
def onError(self):
    box.showerror("Error", "Could not open file")
</pre>

<p>
In case we pressed the error button, we show the error dialog. 
We use the <code>showerror()</code> function to show the dialog 
on the screen. The first parameter of this method is the title of
the message box, the second parameter is the actual message.
</p>


<img src="/img/gui/tkinter/errordlg.png" alt="Warning message dialog">
<div class="figure">Figure: Warning message dialog</div>


<h2>Color chooser</h2>

<p>
The color chooser is a dialog for selecting a color.
It is located in the <code>tkColorChooser</code> module. 
</p>

<pre class="code">
#!/usr/bin/python
# -*- coding: utf-8 -*-

"""
ZetCode Tkinter tutorial

In this script, we use tkColorChooser
dialog to change the background of a frame.

author: Jan Bodnar
last modified: January 2011
website: www.zetcode.com
"""

from Tkinter import Tk, Frame, Button, BOTH, SUNKEN
import tkColorChooser 

class Example(Frame):
  
    def __init__(self, parent):
        Frame.__init__(self, parent)   
         
        self.parent = parent        
        self.initUI()
        
    def initUI(self):
      
        self.parent.title("Color chooser")      
        self.pack(fill=BOTH, expand=1)
        
        self.btn = Button(self, text="Choose Color", 
            command=self.onChoose)
        self.btn.place(x=30, y=30)
        
        self.frame = Frame(self, border=1, 
            relief=SUNKEN, width=100, height=100)
        self.frame.place(x=160, y=30)

    def onChoose(self):
      
        (rgb, hx) = tkColorChooser.askcolor()
        self.frame.config(bg=hx)
         

def main():
  
    root = Tk()
    ex = Example(root)
    root.geometry("300x150+300+300")
    root.mainloop()  


if __name__ == '__main__':
    main()  
</pre>


<p>
We have a button and a frame. Clicking on the button we show a color chooser
dialog. We will change the background color of the frame by selecting a color from 
the dialog.
</p>

<pre class="explanation">
(rgb, hx) = tkColorChooser.askcolor()
self.frame.config(bg=hx)
</pre>

<p>
The <code>askcolor()</code> function shows the dialog. If we click OK, a tuple
is returned. It is a color value in RGB and hexadecimal format.
In the second line we change the background color of the frame, given the color
value.
</p>


<img src="/img/gui/tkinter/colorchooser.png" alt="Color chooser">
<div class="figure">Figure: Color chooser</div>



<h2>File dialog</h2>

<p>
<code>tkFileDialog</code> dialog allows a user to select a file from
the filesystem. 
</p>

<pre class="code">
#!/usr/bin/python
# -*- coding: utf-8 -*-

"""
ZetCode Tkinter tutorial

In this program, we use the
tkFileDialog to select a file from
a filesystem.

author: Jan Bodar
last modified: January 2011
website: www.zetcode.com
"""


from Tkinter import Frame, Tk, BOTH, Text, Menu, END
import tkFileDialog 

class Example(Frame):
  
    def __init__(self, parent):
        Frame.__init__(self, parent)   
         
        self.parent = parent        
        self.initUI()
        
    def initUI(self):
      
        self.parent.title("File dialog")
        self.pack(fill=BOTH, expand=1)
        
        menubar = Menu(self.parent)
        self.parent.config(menu=menubar)
        
        fileMenu = Menu(menubar)
        fileMenu.add_command(label="Open", command=self.onOpen)
        menubar.add_cascade(label="File", menu=fileMenu)        
        
        self.txt = Text(self)
        self.txt.pack(fill=BOTH, expand=1)


    def onOpen(self):
      
        ftypes = [('Python files', '*.py'), ('All files', '*')]
        dlg = tkFileDialog.Open(self, filetypes = ftypes)
        fl = dlg.show()
        
        if fl != '':
            text = self.readFile(fl)
            self.txt.insert(END, text)

    def readFile(self, filename):

        f = open(filename, "r")
        text = f.read()
        return text
         

def main():
  
    root = Tk()
    ex = Example(root)
    root.geometry("300x250+300+300")
    root.mainloop()  


if __name__ == '__main__':
    main()  
</pre>

<p>
In our code example, we use the <code>tkFileDialog</code> dialog to 
select a file and display its contents in a <code>Text</code> widget.
</p>

<pre class="explanation">
self.txt = Text(self)
</pre>

<p>
This is the <code>Text</code> widget in which we will show the contents
of a selected file. 
</p>

<pre class="explanation">
ftypes = [('Python files', '*.py'), ('All files', '*')]
</pre>

<p>
These are file filters. The first shows only Python files, the other
shows all files. 
</p>


<pre class="explanation">
dlg = tkFileDialog.Open(self, filetypes = ftypes)
fl = dlg.show()
</pre>

<p>
The dialog is created and shown on the screen. We get the return value, which
is the name of the selected file. 
</p>

<pre class="explanation">
text = self.readFile(fl)
</pre>

<p>
We read the contents of the file. 
</p>

<pre class="explanation">
self.txt.insert(END, text)
</pre>

<p>
The text is inserted into the <code>Text</code> widget. 
</p>

<img src="/img/gui/tkinter/filedlg.png" alt="tkFileDialog">
<div class="figure">Figure: tkFileDialog</div>

<p>
In this part of the Tkinter tutorial, we worked with dialog windows. 
</p>


<div class="botNav, center">
<span class="botNavItem"><a href="/">Home</a></span> ‡ <span class="botNavItem"><a href="..">Contents</a></span> ‡ 
<span class="botNavItem"><a href="#">Top of Page</a></span>
</div>


<div class="footer">
<div class="signature">
<a href="/">ZetCode</a> last modified January 9, 2011  <span class="copyright">&copy; 2007 - 2013 Jan Bodnar</span>
</div>
</div>

</div> <!-- content -->

</div> <!-- container -->

</body>
</html>

